package com.sunseaypw.web;

import java.io.File;


import org.apache.catalina.Context;
import org.apache.catalina.WebResourceRoot;
import org.apache.catalina.startup.Tomcat;
import org.apache.catalina.webresources.DirResourceSet;
import org.apache.catalina.webresources.StandardRoot;

public class StartWeb {
    public static void main( String[] args ){
        /*在Servlet容器中运行的Servlet具有如下特点：
            无法在代码中直接通过new创建Servlet实例，必须由Servlet容器自动创建Servlet实例；
            Servlet容器只会给每个Servlet类创建唯一实例；
            Servlet容器会使用多线程执行doGet()或doPost()方法。
        复习一下Java多线程的内容，我们可以得出结论：
            在Servlet中定义的实例变量会被多个线程同时访问，要注意线程安全；
            HttpServletRequest和HttpServletResponse实例是由Servlet容器传入的局部变量，它们只能被当前线程访问，不存在多个线程访问的问题；
            在doGet()或doPost()方法中，如果使用了ThreadLocal，但没有清理，那么它的状态很可能会影响到下次的某个请求，因为Servlet容器很可能用线程池实现线程复用。
            因此，正确编写Servlet，要清晰理解Java的多线程模型，需要同步访问的必须同步。

        类似Tomcat这样的服务器也是Java编写的，启动Tomcat服务器实际上是启动Java虚拟机，执行Tomcat的main()方法，
            然后由Tomcat负责加载我们的.war文件【一个war包就是一个webapp，并以文件名作为应用名，Root特殊作为默认根应用】，
            ROOT应用的URL直接Host头之下，其他应用以应用名跟随Host头
            一个Web App就是由一个或多个Servlet组成的，每个Servlet通过注解说明自己能处理的路径。
            早期的Servlet需要在web.xml中配置映射路径，但最新Servlet版本只需要通过注解就可以完成映射。
            并创建一个HelloServlet实例，最后以多线程的模式来处理HTTP请求。
            如果Tomcat服务器收到的请求路径是/（假定部署文件为ROOT.war），
            就转发到HelloServlet并传入HttpServletRequest和HttpServletResponse两个对象。
        */
        try{// 启动Tomcat:
            

            Tomcat tomcat = new Tomcat();
            tomcat.setPort(Integer.getInteger("port", 9999));
            tomcat.getConnector();            
            // 创建根webapp及其目录:
            Context ctx = tomcat.addWebapp("", new File("web-app/src/main/webapp").getAbsolutePath());
            WebResourceRoot resources = new StandardRoot(ctx);
            resources.addPreResources(
                    new DirResourceSet(resources, "/WEB-INF/classes", new File("web-app/target/classes").getAbsolutePath(), "/"));
            ctx.setResources(resources);
            tomcat.start();
            tomcat.getServer().await();
        }catch(Exception ex){
            System.out.println(ex.toString());
        }
    }
}
